Command Query Separation, CQS명령(Command):
어떤 시스템의 상태 변화를 야기하는 작업 지시들로 어떤 결과값의 생성이 없음
조회(Query):
어떤 결과값을 생성하는 정보 요청으로, 그 요청을 처리하는 시스템의 상태 변화를 일으키지 않음
class Creature{
int strenght, agility;
public:
Creature(int strength, int agility): strength(stregnth), agility(agility) {}
void process_command(const CreatureCommand& cc);
int process_query(const CreatureQuery& q) const;
};
Creature의 private 멤버 stregnth, agility에 대한 get/set 메서드를 제공하는 대신,
두 개의 API 멤버 함수 process_command()와 process_query()를 제공한다.
enum class CreatureAbility{ strength, agility };
struct CreatureCommand{
enum Action{set, increaseBy, decreaseBy } action;
CreatureAbility ability;
int amount;
};
struct CreatureQuery{
CreatureAbility ability;
};
명령 객체는 어떤 멤버 변수를 어떻게 얼마나 바꿀것인지 지시한다.
조회 객체는 조회할 대상만 지정한다.
void Creature::process_command(const CreatureCommand& cc){
int* ability;
switch(cc.ability){
case CreatureAbility::strength:
ability=&strength;
break;
case CreatureAbility::agility:
ability=&agility;
break;
}
switch(cc.action){
case CreatureCommand::set:
*ability=cc.amount;
break;
case CreatureCommand::increaseBy:
*ability+=cc.amount;
break;
case CreatureCommand::decreaseBy:
*ablity-=cc.amount;
break;
}
}
int Creature::process_query(const CreatureQuery& q) const {
swich(q.ability){
case CreatureAbility::strength:
return stregnth;
case CreatureAbility::agility;
return agility;
}
return 0;
}
커맨드 디자인 패턴은 인자를 전달하여 메서드를 호출하는 직접적인 방법으로 객체에 일을 시키는 대신,
작업 지시 내용을 감싸는 특별한 객체를 두어 객체와 커뮤니케이션 한다.
실제로 커맨드 디자인 패턴은 UI 시스템에서 “복사하기”, “붙여넣기” 와 같은 익숙한 동작들을 캡슐화 하는데
사용된다.